package string;

/**
 * 给你一个二进制字符串 s 和一个正整数 k 。
 * 请你返回 s 的 最长 子序列的长度，且该子序列对应的 二进制 数字小于等于 k 。
 * 注意：
 * 子序列可以有 前导 0 。
 * 空字符串视为 0 。
 * 子序列 是指从一个字符串中删除零个或者多个字符后，不改变顺序得到的剩余字符序列。
 * <p>
 * 示例 1：
 * 输入：s = "1001010", k = 5
 * 输出：5
 * 解释：s 中小于等于 5 的最长子序列是 "00010" ，对应的十进制数字是 2 。
 * 注意 "00100" 和 "00101" 也是可行的最长子序列，十进制分别对应 4 和 5 。
 * 最长子序列的长度为 5 ，所以返回 5 。
 * <p>
 * 示例 2：
 * 输入：s = "00101001", k = 1
 * 输出：6
 * 解释："000001" 是 s 中小于等于 1 的最长子序列，对应的十进制数字是 1 。
 * 最长子序列的长度为 6 ，所以返回 6 。
 *
 * @author Jisheng Huang
 * @version 20250626
 */
public class LongestSubsequence_2311 {
    /**
     * 从右往左统计1的个数，最后加上所有0的个数，直至大于k或超出int上限
     *
     * @param s the given string
     * @param k the given integer
     * @return the longest subsequence
     */
    public static int longestSubsequence(String s, int k) {
        // Count zeros
        int zeros = 0;

        for (char c : s.toCharArray()) {
            if (c == '0') {
                ++zeros;
            }
        }

        // Count ones backwards
        int ones = 0;

        for (int i = s.length() - 1; i >= 0; --i) {
            if (s.charAt(i) == '1') {
                // Check whether exceeding the limit of int
                if (s.length() - i > 32) {
                    break;
                }

                // Check whether the left part exceeding the limit of k
                if (Long.parseLong(s.substring(i), 2) > k) {
                    break;
                }

                ++ones;
            }
        }

        return zeros + ones;
    }

    public static void main(String[] args) {
        System.out.println(longestSubsequence("1001010", 5));
        System.out.println(longestSubsequence("00101001", 1));
    }
}
